package com.kx.smsplantform.execute;

import com.kx.smsplantform.client.CacheClient;
import com.kx.smsplantform.strategy.Strategy;
import com.kx.smsplatform.common.constants.CacheConstants;
import com.kx.smsplatform.common.model.StandardSubmit;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.io.IOException;
import java.util.Map;

/**
 * 所有策略的执行器，通过这个执行器来调用需要执行的策略
 * 需要一个Executor，获取到全部的策略对象。将所有策略对象交给Spring容器创建。
 * 只需要通过@Autowired注入Map，泛型注入在Spring4.x就已经得到了支持，可以从一级缓存中获取到全部的策略对象。
 *
 * @Author Sun
 * @Date 2021/7/2 11:27
 */
@Slf4j
@Component
public class StrategyExecutor {
    //从spring容器中的一次缓存中获取到所有的执行策略对象
    @Autowired
    private Map<String, Strategy> strategies;
    @Autowired
    private CacheClient client;

    public void executor(StandardSubmit submit) throws IOException {
        log.info("【策略模块-StrategyExecutor】 准备开始执行策略链！");
        //2. 和Cache模块交互,获取客户信息中的filters(需要执行的策略)
        String filters = client.hGet(CacheConstants.CACHE_PREFIX_CLIENT + submit.getClientID(), "filters");
        //3. 根据filters将全部的策略对象进行筛选和排序并依次执行
        if(!StringUtils.isEmpty(filters)){
            //拿到每一个执行策略
            String[] filter = filters.split(",");
            for (String s : filter) {
                //获取到指定的策略
                Strategy strategy = strategies.get(s);
                //4. 返回true,代表当前策略执行成功,继续执行后续策略,返回false,代表策略执行失败.
                if(!strategy.strategy(submit)){
                    break;
                }
            }
        }
    }
}
